#ifndef GY_CELLMERGEANDDRAGTABLE_H
#define GY_CELLMERGEANDDRAGTABLE_H

#include <QTableView>
#include <QStandardItemModel>
#include <QMimeData>
#include <QList>
#include <QModelIndex>
#include "GY_IdTableView.h"

class QAction;

/**
 * @brief 合并单元格和拖拽表
 * @details
 *      1. 多选按住 Ctrl;
 *      2. 拖拽模式默认拖拽行;
 *      3. 已合并单元格禁止拖拽
 */
class GY_CONTROLLIBRARY_EXPORT GY_MergeCellAndDragTable : public GY_IdTableView
{
    Q_OBJECT

public:
    enum class DragDropBehaviorMode;
    explicit GY_MergeCellAndDragTable(QWidget *parent = nullptr);

//-------------------------拖拽 START--------------------------------
    /**
     * @brief The 拖拽模式 enum
     */
    enum class DragDropBehaviorMode{
        Disable,
        SwapSingleCell,  // 单个单元格交换
        SwapSingleRow,   // 单行交换-默认值
        RowInsertOnTheTarget, // 拖动行插入到目标上面，拖动到最下方空白处是在最下方插入
    };
    /**
     * @brief 设置拖拽模式
     * @param state
     */
    void setDragDropBehaviorMode(DragDropBehaviorMode mode);
//-------------------------拖拽 END--------------------------------

//-------------------------单元格合并 START--------------------------------
    /**
     * @brief 合并单元格
     * @param varRowId 行ID
     * @param col 列值
     * @param rowCount 纵向，以varRowId和col得出的单元格位置，向下合并rowCount-1个单元格。
     * @param colCount 横向，以varRowId和col得出的单元格位置，向右合并rowCount-1个单元格。
     * @return
     */
    bool mergeCells(QVariant varRowId, qint32 col=0,qint32 rowCount=1, qint32 colCount=1);

    /**
     * @brief 合并单元格
     * @param startVarRowId 开始单元格行id
     * @param startCol      开始单元格列值
     * @param endVarRowId
     * @param endCol
     * @return
     */
    bool mergeCells(QVariant startVarRowId, qint32 startCol, QVariant endVarRowId, qint32 endCol);

    /**
     * @brief 拆分单元格
     * @param varRowId
     * @param col
     * @return
     */
    void unMergeCells(QVariant varRowId, qint32 col=0);

//-------------------------单元格合并 END--------------------------------

protected:
//-------------------------单元格合并 START--------------------------------
    /**
     * @brief 合并单元格
     * @param indexList
     * @return
     */
    bool mergeCells(const QModelIndexList &_indexList);

    /**
     * @brief 拆分单元格
     * @param index
     * @return
     */
    void unMergeCells(const QModelIndex &index);
//-------------------------单元格合并 END--------------------------------

private:
    /**
     * @brief 进入单元格多选模式
     */
    void EnterItemMultiSelectMode();

    /**
     * @brief 进如单元格单选中模式
     */
    void EnterItemSingleSelectMode();


    /**
     * @brief 内部拖拽模型
     */
    class InSideDragStanardItemModel:public QStandardItemModel
    {
    public:
        InSideDragStanardItemModel(QTableView *pView, QObject *parent = nullptr);

    protected:
        virtual Qt::ItemFlags flags(const QModelIndex &index) const override;
        QMimeData * mimeData(const QModelIndexList &indexes) const override;
        bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override;
    private:
        friend class GY_MergeCellAndDragTable;
        QTableView *m_pParentView=nullptr;
        DragDropBehaviorMode m_mode=DragDropBehaviorMode::SwapSingleRow;
    };

protected:
    virtual void keyPressEvent(QKeyEvent *event) override;
    virtual void keyReleaseEvent(QKeyEvent *event) override;
};

#endif // GY_CELLMERGEANDDRAG_H
